// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build windows
// +build windows

package win注册表类

import (
	"errors"
	"golang.org/x/sys/windows/registry"
	"syscall"
)

const (
	// X常量_值类型_NONE 注册表值类型。
	X常量_值类型_NONE                       = 0
	X常量_值类型_SZ                         = 1
	X常量_值类型_EXPAND_SZ                  = 2
	X常量_值类型_BINARY                     = 3
	X常量_值类型_DWORD                      = 4
	X常量_值类型_DWORD_BIG_ENDIAN           = 5
	X常量_值类型_LINK                       = 6
	X常量_值类型_MULTI_SZ                   = 7
	X常量_值类型_RESOURCE_LIST              = 8
	X常量_值类型_FULL_RESOURCE_DESCRIPTOR   = 9
	X常量_值类型_RESOURCE_REQUIREMENTS_LIST = 10
	X常量_值类型_QWORD                      = 11
)

var (
	// X常量_错误_缓存区太小 当缓冲区太短时返回。
	X常量_错误_缓存区太小 = syscall.ERROR_MORE_DATA

	// X常量_错误_不存在 当注册表项或值不存在时返回。
	X常量_错误_不存在 = syscall.ERROR_FILE_NOT_FOUND

	// X常量_错误_意外键值类型 当值的类型意外时，GetValue返回。
	X常量_错误_意外键值类型 = errors.New("unexpected key value type") //
)

/*
go类型对应注册表类型:
REG_SZ (字符串) - 对应 string
REG_EXPAND_SZ (可扩展字符串) - 对应 string
REG_BINARY (二进制数据) - 对应 []byte 或 []uint8
REG_DWORD (32位无符号整数) - 对应 uint32
REG_QWORD (64位无符号整数) - 对应 uint64
REG_MULTI_SZ (多字符串) - 对应 []string
*/

// X底层_取值 检索与开放注册表对象k关联的指定值的类型和数据. 它填充缓冲区buf并返回检索到的字节计数n.
// X底层_取值 是一个低级函数。如果值的类型已知，请改用相应的GetValue函数。
//
// 如果buf太小，无法容纳存储的值，则返回ErrShortBuffer错误以及所需的缓冲区大小n。
// 如果没有提供缓冲区，则返回true和实际缓冲区大小n。
// 如果未提供缓冲区，则GetValue仅返回值的类型。
// 如果该值不存在，则返回的错误为ErrNotExist。
func (k *Key) X底层_取值(名称 string, 缓冲区 []byte) (n int, 值类型 uint32, 错误 error) {
	if k == nil {
		return 0, 0, errors.New("注册表类对象为nil")
	}
	return k.父类.GetValue(名称, 缓冲区)
}

// X取文本值 检索与开放注册表对象k关联的指定值名称的字符串值。它还返回值的类型。
// REG_SZ (字符串) - 对应 string
// REG_EXPAND_SZ (可扩展字符串) - 对应 string
//
// 如果值不存在，GetStringValue将返回ErrNotExist。
// 如果值不是SZ或EXPAND_SZ，它将返回正确的值
// 类型和ErrUnexpectedType。
func (k *Key) X取文本值(名称 string) (值 string, 值类型 uint32, 错误 error) {
	if k == nil {
		return "", 0, errors.New("注册表类对象为nil")
	}
	return k.父类.GetStringValue(名称)
}

// X取文本值PANI 检索与开放注册表对象k关联的指定值名称的本地化字符串值。
// REG_SZ (字符串) - 对应 string
// REG_EXPAND_SZ (可扩展字符串) - 对应 string
//
// 如果值名称不存在或无法解析本地化字符串值, GetMUIStringValue返回ErrNotExist。
// 如果系统不支持regLoadMUIString，则GetMUIStringValue会死机；
// 在调用此函数之前，使用LoadRegLoadMUIString检查是否支持regLoadMUISString。
func (k *Key) X取文本值PANI(名称 string) (string, error) {
	if k == nil {
		return "", errors.New("注册表类对象为nil")
	}
	return k.父类.GetMUIStringValue(名称)
}

// X解析环境变量 展开环境变量字符串并用为当前用户定义的值替换它们。
// 使用ExpandString展开expand_SZ字符串。
func X解析环境变量(值 string) (string, error) {
	return registry.ExpandString(值)
}

// X取文本数组值 检索与打开键k关联的指定值名称的数组字符串值。它还返回值的类型。
// REG_MULTI_SZ (多字符串) - 对应 []string
//
// 如果值不存在，GetStringsValue将返回ErrNotExist。
// 如果值不是REG_MULTI_SZ(多字符串) ，它将返回正确的值类型和ErrUnexpectedType。
func (k *Key) X取文本数组值(名称 string) (值 []string, 值类型 uint32, 错误 error) {
	if k == nil {
		return nil, 0, errors.New("注册表类对象为nil")
	}
	return k.父类.GetStringsValue(名称)
}

// X取整数值 检索与开放注册表对象k关联的指定值名称的整数值。它还返回值的类型。
// REG_DWORD (32位无符号整数) - 对应 uint32
// REG_QWORD (64位无符号整数) - 对应 uint64
//
// 如果值不存在，则GetIntegerValue返回ErrNotExist。
// 如果值不是DWORD或QWORD，它将返回正确的值类型和ErrUnexpectedType。
func (k *Key) X取整数值(名称 string) (值 uint64, 值类型 uint32, err error) { //
	if k == nil {
		return 0, 0, errors.New("注册表类对象为nil")
	}
	返回整数, 值类型, err := k.父类.GetIntegerValue(名称)
	return 返回整数, 值类型, err
}

// X取字节集值 检索与开放注册表对象k关联的指定值名称的二进制值。它还返回值的类型。
// REG_BINARY (二进制数据) - 对应 []byte
//
// 如果值不存在，GetBinaryValue将返回ErrNotExist。
// 如果值不是BINARY，它将返回正确的值类型和ErrUnexpectedType。
func (k *Key) X取字节集值(名称 string) (值 []byte, 值类型 uint32, 错误 error) {
	if k == nil {
		return nil, 0, errors.New("注册表类对象为nil")
	}
	return k.父类.GetBinaryValue(名称)
}

// X设置整数值_DWORD 将注册表对象k下的名称值的数据和类型设置为value和DWORD。
// REG_DWORD (正整数32位) - 对应 uint32
func (k *Key) X设置整数值_DWORD(名称 string, 值 int32) error {
	if k == nil {
		return errors.New("注册表类对象为nil")
	}

	return k.父类.SetDWordValue(名称, uint32(值))
}

// X设置整数值_QWORD 将注册表对象k下的名称值的数据和类型设置为值和QWORD。
// REG_QWORD (正整数64位) - 对应 uint64
func (k *Key) X设置整数值_QWORD(名称 string, 值 int64) error {
	if k == nil {
		return errors.New("注册表类对象为nil")
	}
	return k.父类.SetQWordValue(名称, uint64(值))
}

// X设置文本值_SZ 将注册表对象k下的名称值的数据和类型设置为值和SZ。该值不能包含零字节。
// REG_SZ (字符串) - 对应 string
func (k *Key) X设置文本值_SZ(名称, 值 string) error {
	if k == nil {
		return errors.New("注册表类对象为nil")
	}
	return k.父类.SetStringValue(名称, 值)
}

// X设置文本值_EXPAND_SZ 将键k下的名称值的数据和类型设置为value和EXPAND_SZ。该值不得包含零字节。
// REG_EXPAND_SZ (可扩展字符串) - 对应 string
func (k *Key) X设置文本值_EXPAND_SZ(名称, 值 string) error {
	if k == nil {
		return errors.New("注册表类对象为nil")
	}
	return k.父类.SetExpandStringValue(名称, 值)
}

// X设置文本数组值_MULTI_SZ 将键k下的名称值的数据和类型设置为值和MULTI_SZ。值字符串不能包含零字节。
// REG_MULTI_SZ (多字符串) - 对应 []string
func (k *Key) X设置文本数组值_MULTI_SZ(名称 string, 值 []string) error {
	if k == nil {
		return errors.New("注册表类对象为nil")
	}
	return k.父类.SetStringsValue(名称, 值)
}

// X设置字节集值_BINARY 将注册表对象k下的名称值的数据和类型设置为值和BINARY。
// REG_BINARY (二进制数据) - 对应 []byte
func (k *Key) X设置字节集值_BINARY(名称 string, 值 []byte) error {
	if k == nil {
		return errors.New("注册表类对象为nil")
	}
	return k.父类.SetBinaryValue(名称, 值)
}

// X删除值 从键k中删除命名值。
func (k *Key) X删除值(名称 string) error {
	if k == nil {
		return errors.New("注册表类对象为nil")
	}
	return k.父类.DeleteValue(名称)
}

// X取所有子项值 返回key k的值名称。
// 参数n控制返回名称的数量，类似于os.File.Readdirnames的工作方式。
func (k *Key) X取所有子项值(返回数量 int) ([]string, error) {
	if k == nil {
		return nil, errors.New("注册表类对象为nil")
	}
	return k.父类.ReadValueNames(返回数量)
}
